package com.floreantpos.model;

import java.util.Iterator;
import java.util.List;

import com.floreantpos.model.base.BaseTicketItemModifierGroup;
import com.floreantpos.model.dao.MenuModifierDAO;

public class TicketItemModifierGroup extends BaseTicketItemModifierGroup {

  private static final long serialVersionUID = 1L;

  public TicketItemModifierGroup() {
    super();
  }

  public TicketItemModifierGroup(java.lang.Integer id) {
    super(id);
  }

  public int countItems(boolean excludeNoModifier) {
    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    if (ticketItemModifiers == null) {
      return 0;
    }

    int count = 0;
    for (TicketItemModifier modifier : ticketItemModifiers) {
      if (excludeNoModifier) {
        if (modifier.getModifierType() != TicketItemModifier.NO_MODIFIER) {
          count += modifier.getItemCount();
        }
      } else {
        if (modifier.getModifierType() == TicketItemModifier.NO_MODIFIER) {
          count++;
        } else {
          count += modifier.getItemCount();
        }
      }
    }
    return count;
  }

  public TicketItemModifier findTicketItemModifier(MenuModifier modifier) {
    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    if (ticketItemModifiers == null) {
      return null;
    } else {
      for (TicketItemModifier ticketItemModifier : ticketItemModifiers) {
        if (modifier.getId().equals(ticketItemModifier.getItemId())) {
          return ticketItemModifier;
        }
      }
    }

    return null;
  }

  public TicketItemModifier addTicketItemModifier(MenuModifier menuModifier, int modifierType) {
    TicketItemModifier ticketItemModifier = new TicketItemModifier();
    ticketItemModifier.setItemId(menuModifier.getId());
    ticketItemModifier.setGroupId(menuModifier.getModifierGroup().getId());
    ticketItemModifier.setItemCount(1);
    ticketItemModifier.setName(menuModifier.getName());
    ticketItemModifier.setUnitPrice(menuModifier.getPrice());
    ticketItemModifier.setExtraUnitPrice(menuModifier.getExtraPrice());
    ticketItemModifier.setTaxRate(menuModifier.getTax() == null ? 0 : menuModifier.getTax().getRate());
    ticketItemModifier.setModifierType(modifierType);
    ticketItemModifier.setShouldPrintToKitchen(menuModifier.isShouldPrintToKitchen());
    ticketItemModifier.setPizzaModifier(menuModifier.isPizzaModifier());
    ticketItemModifier.setMinQuantity(menuModifier.getMenuItemModifierGroup().getMinQuantity());
    ticketItemModifier.setModifierId(menuModifier.getId());
    ticketItemModifier.setParent(this);

    addToticketItemModifiers(ticketItemModifier);

    if (ticketItemModifier.isPizzaModifier()) {
      setPizzaModifierPrice();
    }

    return ticketItemModifier;
  }

  public TicketItemModifier removeTicketItemModifier(TicketItemModifier ticketItemModifier) {
    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    if (ticketItemModifiers == null) {
      return ticketItemModifier;
    }

    for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) {
      TicketItemModifier oldTicketItemModifier = (TicketItemModifier) iter.next();
      if (oldTicketItemModifier.getItemId().equals(ticketItemModifier.getItemId())) {
        iter.remove();

        if (ticketItemModifier.isPizzaModifier()) {
          setPizzaModifierPrice();
        }

        return oldTicketItemModifier;
      }
    }
    return ticketItemModifier;
  }

  public double getSubtotal() {
    if (getTicketItemModifiers() == null) {
      return 0;
    }

    double subtotal = 0;
    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    for (TicketItemModifier modifier : ticketItemModifiers) {
      subtotal += modifier.calculateTotal();
    }
    return subtotal;
  }

  public double getTax() {
    double tax = 0;
    if (getTicketItemModifiers() == null) {
      return tax;
    }

    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    for (TicketItemModifier modifier : ticketItemModifiers) {
      double taxRate = modifier.getTaxRate();
      double modifierSubtotal = modifier.calculateTotal();

      if (taxRate > 0) {
        tax += (modifierSubtotal * taxRate / 100.0);
      }
    }
    return tax;
  }

  public double getTotal() {
    return getSubtotal() + getTax();
  }

  public void setPizzaModifierPrice() {
    int pizzaModifierQty = 0;
    int pizzaModifierWithPrice = 0;

    List<TicketItemModifier> ticketItemModifiers = getTicketItemModifiers();
    if (ticketItemModifiers != null) {
      for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) {
        TicketItemModifier ticketItemModifier = (TicketItemModifier) iter.next();
        if (ticketItemModifier.isPizzaModifier()) {
          pizzaModifierQty = pizzaModifierQty + 1;
          if (ticketItemModifier.getUnitPrice() != 0) {
            pizzaModifierWithPrice = pizzaModifierWithPrice + 1;
          }
        }
      }

      if (pizzaModifierWithPrice == 0) {
        for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) {
          TicketItemModifier ticketItemModifier = (TicketItemModifier) iter.next();
          if (ticketItemModifier.isPizzaModifier()) {
            MenuModifierDAO menuModifierDAO = new MenuModifierDAO();
            MenuModifier menuModifier = menuModifierDAO.get(ticketItemModifier.getItemId());
            ticketItemModifier.setUnitPrice(menuModifier.getPrice());
            ticketItemModifier.setExtraUnitPrice(menuModifier.getExtraPrice());
            ticketItemModifier.setTaxRate(menuModifier.getTax() == null ? 0 : menuModifier.getTax().getRate());

            pizzaModifierWithPrice = pizzaModifierWithPrice + 1;
          }
        }
      }

      if (pizzaModifierQty > 1 && pizzaModifierWithPrice > 1) {
        int pizzaModifierID = 0;
        Double pizzaModifierPrice = Double.valueOf(0);
        do {
          for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) {
            TicketItemModifier ticketItemModifier = (TicketItemModifier) iter.next();
            if (ticketItemModifier.isPizzaModifier()) {
              pizzaModifierID = ticketItemModifier.getItemId();
              pizzaModifierPrice = ticketItemModifier.getUnitPrice();
            }
            for (Iterator iter2 = ticketItemModifiers.iterator(); iter2.hasNext();) {
              TicketItemModifier ticketItemModifier2 = (TicketItemModifier) iter2.next();
              if (ticketItemModifier2.isPizzaModifier()) {
                if (ticketItemModifier2.getItemId() != pizzaModifierID && ticketItemModifier2.getUnitPrice() <= pizzaModifierPrice) {
                  ticketItemModifier2.setUnitPrice(Double.valueOf(0));
                  ticketItemModifier2.setExtraUnitPrice(Double.valueOf(0));
                  ticketItemModifier2.setTaxRate(Double.valueOf(0));

                  pizzaModifierWithPrice = pizzaModifierWithPrice - 1;
                }
              }
            }
          }
        } while (pizzaModifierWithPrice > 1);
      }

      if (pizzaModifierQty == 1 && pizzaModifierWithPrice == 0) {
        for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) {
          TicketItemModifier ticketItemModifier = (TicketItemModifier) iter.next();
          if (ticketItemModifier.isPizzaModifier()) {
            MenuModifierDAO menuModifierDAO = new MenuModifierDAO();
            MenuModifier menuModifier = menuModifierDAO.get(ticketItemModifier.getItemId());
            ticketItemModifier.setUnitPrice(menuModifier.getPrice());
            ticketItemModifier.setExtraUnitPrice(menuModifier.getExtraPrice());
            ticketItemModifier.setTaxRate(menuModifier.getTax() == null ? 0 : menuModifier.getTax().getRate());

            pizzaModifierWithPrice = pizzaModifierWithPrice + 1;
          }
        }
      }
    }
  }
}
